#pragma once

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include "Util.hpp"

using namespace std;

const string sep = "\r\n";
const string default_root = "./wwwroot";
const string home_page = "index.html"; // 网站的首页
const string html_404 = "wwwroot/404.html";

class HttpRequest
{
public:
    HttpRequest() {}
    ~HttpRequest() {}
    void parse()
    {
        // 1.从inbuffer中拿到第一行，分隔符\r\n
        string line = Util::getOneLine(_inbuffer, sep);
        if (line.empty())
            return;

        // 2.从请求行中提取三个字段 method url version
        cout << "line-> " << line << endl;
        stringstream ss(line); // stringstream只能以空格和换行作为分隔符，难一点的分隔他做不到
        ss >> _method >> _url >> _httpversion;

        // 2.1 /a/b/c?name=zhangsan&pwd=123456
        // 通过? 将左右进行分离，如果是POST方法，那他本来就是分离的，但如果是GET方法，参数和url会黏在一起
        // 左边: path  右边: parm

        // 3.添加web服务器的默认路径
        _path = default_root; // ./wwwroot
        _path += _url;        // ./wwwroot/a/b/c.html。如果url是/的话那拼接过后就变为./wwwroot/，这样就糟糕了，不知道要访问哪个资源
        if (_path[_path.size() - 1] == '/')
        {
            _path += home_page; // 直接给你返回网站首页的资源 也就是index.html
        }

        // 4.将请求资源文件的后缀放到suffix里面
        // ./wwwroot/index.html
        // ./wwwroot/404.html
        // ./wwwroot/image/桃花.jpg
        auto pos = _path.rfind('.');
        if (pos == string::npos)
            _suffix = ".html"; // 如果找不到，则默认的后缀我们搞成.html
        else
            _suffix = _path.substr(pos);

        // 5.得到请求资源的大小
        struct stat st;
        int n = stat(_path.c_str(), &st);
        if(n == 0) _size = st.st_size;
        else _size = -1;
    }

public:
    string _inbuffer;
    // string _reqline;
    // vector<string> _reqheader;//请求报头
    // string _body;//请求报文

    // 对请求行再解析
    string _method;
    string _url;
    string _httpversion;
    string _path; // 客户端请求资源的路径
    string _suffix;
    int _size; // 客户端请求资源的大小
    string _parm;
};

class HttpResponse
{
public:
public:
    string _outbuffer;
};